home *** CD-ROM | disk | FTP | other *** search
- 10 REM **** CPACPM ****
- 30 CLOSE
- 40 ON ERROR GOTO 7800
- 240 DEFINT B-Z:DEFSNG A
- 250 DIM S(500),F(500),E(1000),L(1000),D$(500),D(500),O2(500)
- 260 DIM A(1500),P(500),A3(100),B(500),S$(48)
- 290 DIM X$(12),A6(500)
- 302 DEF FNF1(I)=L(F(I))-E(S(I))-D(I) 'FLOAT
- 304 DEF FNS2(I)=L(F(I))-D(I) 'LATE START
- 306 DEF FNF2(I)=E(S(I))+D(I) 'EARLY FINISH
- 310 FOR I=1 TO 12
- 320 READ X$(I)
- 330 NEXT I
- 340 DATA "JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"
- 380 B4=VAL(MID$(DATE$,1,2))
- 390 B5=VAL(MID$(DATE$,4,2))
- 400 B6=VAL(MID$(DATE$,9,2))
- 440 F9=0:PRINT:GOSUB 5010
- 485 IF LEFT$(T6$,3)<>"WOR" AND LEFT$(T6$,3)<>"CAL" THEN T7=1 ELSE T7=0
- 490 PRINT FRE(0)
- 491 FOR I=2 TO N:IF S(I)<S(I-1) THEN 495
- 492 NEXT
- 493 PRINT "**** BYPASSING SORT ROUTINE ****"
- 494 FOR I=1 TO N:P(I)=I:NEXT:GOTO 497
- 495 PRINT "**** SORTING"N"ACTIVITIES - TAKES";N/4;"SECONDS IN REGULAR BASIC ****":GOSUB 7370
- 497 H$=F$+".OUT"
- 500 PRINT "The Output Filename is ";H$;" O.K. (Y/N) ";Q$;
- 501 INPUT Q$
- 502 IF LEFT$(Q$,1)<>"N" THEN 510
- 505 INPUT "Enter the Output File Name ";H$
- 507 REM GOSUB 10000 'TEST FILE NAME
- 508 GOTO 500
- 510 OPEN H$ FOR OUTPUT AS #2
- 520 OPEN F$+".LGS" FOR OUTPUT AS #3 ' SORT FILE
- 530 INPUT "Want to adjust for reported finish times (Y/N) ";Q2$
- 540 IF LEFT$(Q2$,1)="N" THEN F5=0 ELSE F5=1
- 570 L(S(P(1)))=0 '******GUTS OF CPA*************************************
- 580 FOR I=1 TO N
- 590 E(S(I))=0
- 600 L(F(I))=-5000
- 610 NEXT I
- 620 E(F(P(N)))=0
- 630 FOR I=1 TO N
- 640 M1=E(S(P(I)))+D(P(I))
- 650 IF E(F(P(I)))<=M1 THEN E(F(P(I)))=M1
- 660 NEXT I
- 670 L(F(P(N)))=E(F(P(N)))
- 680 FOR I=N TO 1 STEP -1
- 690 L1=S(P(I))
- 700 M2=L(F(P(I)))-D(P(I))
- 710 IF L(L1)>=M2 OR L(L1)=-5000 THEN L(L1)=M2
- 720 NEXT I
- 730 C3=L(F(P(N)))
- 740 PRINT "**** PROJECT LENGTH IS";C3;T6$;" ****"
- 741 IF F9=1 THEN 930
- 742 PRINT "**** THIS WILL TAKE"C3/2*(F5+1)"SECONDS IN REGULAR BASIC ****":BEEP
- 750 IF F5=1 THEN M9=C3*2 ELSE M9=C3+1
- 770 IF T7=1 THEN 1110
- 780 IF A(1)<>0 THEN 930
- 820 D1=1
- 830 GOSUB 7010 'GET DAY OF CENTURY - A8
- 845 GOSUB 8000 'READ HOLIDAYS
- 920 GOSUB 7090 'CREATE ARRAY OF MMDDYYS
- 930 A7=A(C3+1)
- 950 GOSUB 7550 'CONVERT TO STRING
- 960 PRINT " **** END DATE IS ";P6$;" ****"
- 990 IF F5=1 THEN 7660
- 1110 G1=5000 'ARBITRARILY HIGH
- 1120 FOR I=1 TO N
- 1130 IF FNF1(P(I))<G1 THEN G1=FNF1(P(I))
- 1140 NEXT I
- 1150 WRITE #3,A9,A(1),C3
- 1160 PRINT "**** READING SUBCONTRACTORS ****"
- 1161 REM ON ERROR GOTO 1200
- 1162 OPEN F$+".SBC" FOR INPUT AS #1
- 1164 J=0
- 1166 J=J+1
- 1168 IF EOF(1) THEN 1180
- 1170 INPUT #1,S$(J)
- 1172 IF J=48 THEN 1180
- 1174 GOTO 1166
- 1180 CLOSE #1:GOTO 1240
- 1200 PRINT "**** NO SUBCONTRACTOR FILE - CONTINUING ****"
- 1240 PRINT " **** OUTPUTTING ANALYSIS AND SORT FILE ****"
- 1250 IF LEN(P$)>60 THEN P1$=LEFT$(P$,60) ELSE P1$=P$
- 1260 T4=INT((118-52-LEN(P1$))/2)
- 1270 PRINT #2,TAB(T4);"CRITICAL PATH ANALYSIS FOR: ";P1$;" RUN DATE: ";X$(B4);B5;", 19";RIGHT$(STR$(B6),2)
- 1280 PRINT #2,G9$
- 1290 T4=((120-15-LEN(T6$))/2)
- 1300 PRINT #2,TAB(T4);"TIME PERIOD = ";T6$
- 1310 PRINT #2,G9$
- 1320 W4$=" DESCRIPTION "
- 1330 W$="ACTIVITY"+W4$+"FROM TO EST. ACTUAL EARLY LAST EARLY LAST FLOAT C REPORT SUBCONTRACTOR"
- 1340 W1$="NODE NODE TIME TIME START START FINISH FINISH TIME P FINISH NAME"
- 1350 PRINT #2,W$
- 1360 PRINT #2,TAB(42);W1$
- 1370 PRINT #2,G9$
- 1380 S4$="\ \"
- 1390 S5$=" \ \ \ \ "
- 1400 S$=S4$+" #### #### #### #### "+S5$+S5$+"#### ! \ \ \ \"
- 1410 S1$=S4$+" , #### , #### , #### , #### , #### , #### , #### , #### , #### , \ \ , ## "
- 1420 FOR I=1 TO N
- 1440 IF T7=1 THEN A7=L(F(I))+1 ELSE A7=A(L(F(I))+1)
- 1460 GOSUB 7550
- 1470 R4$=P6$
- 1480 IF T7=1 THEN A7=E(S(I))+1 ELSE A7=A(E(S(I))+1)
- 1500 GOSUB 7550
- 1510 R1$=P6$
- 1520 IF T7=1 THEN A7=FNS2(I)+1 ELSE A7=A(FNS2(I)+1)
- 1540 GOSUB 7550
- 1550 R2$=P6$
- 1560 IF T7=1 THEN A7=FNF2(I)+1 ELSE A7=A(FNF2(I)+1)
- 1580 GOSUB 7550
- 1590 R3$=P6$
- 1600 IF A6(I)=0 THEN R6$="":GOTO 1660
- 1630 A7=A6(I)
- 1640 GOSUB 7550
- 1650 R6$=P6$
- 1660 IF FNF1(I)=G1 THEN G1$="*" ELSE G1$=" "
- 1670 PRINT #2,USING S$;D$(I),S(I),F(I),O2(I),D(I),R1$,R2$,R3$,R4$,FNF1(I),G1$,R6$,S$(B(I))
- 1680 PRINT #3,USING S1$;D$(I),S(I),F(I),O2(I),D(I),E(S(I)),FNS2(I),FNF2(I),L(F(I)),FNF1(I),R6$,B(I)
- 1690 NEXT I
- 1700 CLOSE #3
- 1710 IF LEFT$(Q2$,1)="N" THEN 1845
- 1720 INPUT "Want to create an updated schedule (Y/N) ";Q$
- 1840 IF LEFT$(Q$,1)="N" THEN 1845 ELSE GOSUB 7820
- 1845 PRINT "**** FINISHED CPM - WRITING CRITICAL PATH LIST TO FILE ****"
- 1850 PRINT #2,G9$
- 1860 PRINT #2," THE CRITICAL PATH LENGTH IS";C3;
- 1880 PRINT #2,G9$
- 1890 PRINT #2," COMPLETE LIST OF CRITICAL PATH ACTIVITIES (THOSE ACTIVITIES DENOTED ABOVE BY *)"
- 1900 PRINT #2,G9$
- 1910 PRINT #2," ACTIVITY DESCRIPTION";SPC(19);
- 1920 PRINT #2,"FROM NODE TO NODE DURATION CUM.TIME"
- 1930 PRINT #2," ----------------------------------------------------------------------------"
- 1940 S5$=" \ \ #### #### #### #####"
- 1960 K3=0:K=0:E(S(1))=0:S9=0
- 1990 FOR I=1 TO N
- 2000 IF FNF1(P(I))<>G1 THEN 2030
- 2010 K=K+1
- 2020 L(K)=P(I)
- 2030 NEXT I
- 2040 S8=D(L(1))+S9
- 2050 J=0:I=1:GOSUB 7610:IF K=1 THEN 2335 ELSE F5=F(L(1))
- 2100 FOR I=2 TO K
- 2110 IF S(L(I))<>F5 THEN 2160
- 2120 S8=S8+D(L(I))
- 2130 GOSUB 7610
- 2140 F5=F(L(I))
- 2150 GOTO 2190
- 2160 J=J+1
- 2170 S(J)=L(I)
- 2180 IF J=1 THEN S9=E(S(L(I)))
- 2190 NEXT I
- 2200 PRINT #2,G9$:K3=K3+1
- 2220 IF K3=1 THEN PRINT #2,TAB(10);
- 2230 PRINT #2,TAB(24);"PATH ENDS AT NODE";F(L(K4));
- 2240 IF K3<>1 THEN PRINT #2,"REJOINING PRIOR PATH" ELSE PRINT #2,G9$
- 2250 IF J=0 THEN 2335
- 2260 PRINT #2,G9$
- 2270 PRINT #2," CRITICAL PATH NUMBER";K3+1;"STARTING AT NODE";S(S(1))
- 2280 PRINT #2,G9$
- 2290 FOR I=1 TO J:L(I)=S(I):NEXT I:K=J:GOTO 2040
- 2335 CHAIN "CPAMENU"
- 5000 REM **** READING IN ALREADY CREATED INPUT FILE ******************
- 5010 INPUT "Enter the name of the input file [.CPM] ";G$
- 5015 IF G$="Q" OR G$="QUIT" THEN 2335
- 5020 P=INSTR(1,G$,"."):IF P<>0 THEN F$=LEFT$(G$,INSTR(1,G$,".")-1) ELSE F$=G$
- 5030 IF LEN(F$)>8 THEN PRINT "**** NOT A VALID PCPM FILE ****":BEEP:GOTO 5010
- 5035 REM ON ERROR GOTO 5300
- 5037 G$=F$+".CPM"
- 5040 OPEN G$ FOR INPUT AS #3
- 5050 INPUT #3,P$,T6$,DA$
- 5060 I=0
- 5070 I=I+1
- 5080 IF EOF(3) THEN 5120
- 5090 INPUT #3,D$(I),S(I),F(I),O2(I),D(I),A6(I),PC,B(I),CT
- 5100 IF I/10=INT(I/10) THEN PRINT I;
- 5110 GOTO 5070
- 5120 N=I-1
- 5125 IF LEN(DA$)=5 THEN DA$=" "+DA$
- 5130 AM6=VAL(LEFT$(DA$,2)):D6=VAL(MID$(DA$,3,2)):Y6=VAL(RIGHT$(DA$,2))
- 5140 CLOSE #3
- 5150 PRINT " **** INPUT FILE READ ****"
- 5160 RETURN
- 5300 PRINT "**** FILE DOES NOT EXIST - TRY AGAIN ****":BEEP:GOTO 5000
- 7000 REM ** GET DAY OF CENTURY OF STARTING DATE ************************
- 7010 L8=2
- 7020 IF INT(Y6/4)=Y6/4 THEN L8=1
- 7030 D7=INT(AM6*275/9)+D6-30
- 7040 IF AM6>2 THEN D7=D7-L8
- 7050 A8=INT((Y6-1)*365.25)+D7
- 7060 A9=A8
- 7070 RETURN
- 7080 REM ** CREATE ARRAY OF MMDDYYS ******************************
- 7090 A(1)=AM6*10000+D6*100+Y6
- 7100 D1=D1+1
- 7110 IF D1>M9 THEN RETURN
- 7120 A8=A8+1
- 7130 GOSUB 7210
- 7140 IF LEFT$(T6$,3)="CAL" THEN 7150 ELSE IF D4=6 OR D4=7 THEN 7120
- 7150 O8=0
- 7160 GOSUB 7320
- 7170 IF O8=1 THEN 7120
- 7180 A(D1)=AM5*10000+D5*100+Y5
- 7190 GOTO 7100
- 7200 REM ** CONVERT CENTURY DAY TO MM, DD, YY **************************
- 7210 T9=INT(A8/1461)
- 7220 Y5=INT((A8-T9+364)/365)
- 7230 Y4=A8-INT((Y5-1)*365.25)
- 7240 L8=2
- 7250 IF Y5/4=INT(Y5/4) THEN L8=1
- 7260 T9=Y4
- 7270 IF T9>61-L8 THEN T9=T9+L8
- 7280 AM5=INT((T9*9+269)/275)
- 7290 D5=T9-INT(AM5*275/9)+30
- 7300 D4=A8-INT(A8/7)*7+1
- 7310 RETURN
- 7320 FOR J=1 TO H9 '**** HOLIDAY OR NOT ***********************************
- 7330 IF A8=A3(J) THEN O8=1
- 7340 NEXT J
- 7350 RETURN
- 7360 REM **** SHELL METZNER SORT ****************************************
- 7370 J=N
- 7380 FOR I=1 TO N:P(I)=J:J=J-1:NEXT I
- 7390 M=N
- 7400 M=INT(M/2)
- 7410 IF M=0 THEN RETURN
- 7420 J=1
- 7430 K=N-M
- 7440 I=J
- 7450 L=I+M
- 7460 IF S(P(I))<S(P(L)) THEN 7510
- 7470 SWAP P(I),P(L)
- 7480 I=I-M
- 7490 IF I<1 THEN 7510
- 7500 GOTO 7450
- 7510 J=J+1
- 7520 IF J>K THEN 7400
- 7530 GOTO 7440
- 7540 REM **** CONVERT TO MONTH DAY YEAR IN STRING FORMAT ****
- 7550 P6$=STR$(A7)
- 7560 IF T7=1 THEN 7600
- 7570 IF LEN(P6$)=6 THEN P6$=" "+P6$
- 7580 U9=VAL(LEFT$(P6$,3))
- 7590 P6$=X$(U9)+RIGHT$(P6$,4)
- 7600 RETURN
- 7610 REM *** BEGINNING OF PRINT SUBROUTINE ****
- 7620 PRINT #2,USING S5$;D$(L(I)),S(L(I)),F(L(I)),D(L(I)),S8
- 7630 K4=I
- 7640 E(F(L(I)))=S8
- 7650 RETURN
- 7660 I5=0 '****SUBROUTINE TO CHECK REPORT FINISHES ****
- 7670 I5=I5+1
- 7680 IF I5>N THEN 1110
- 7690 IF A6(I5)=0 THEN 7670
- 7700 FOR J=1 TO C3+1
- 7710 IF A6(I5)=A(J) THEN 7750
- 7720 NEXT J
- 7730 PRINT "**** BAD DATE:";A6(I5);"FOR: ";D$(I5);" - NO ADJUSTMENT ****"
- 7740 GOTO 7670
- 7750 J=J-1 'J=DAY NUMBER CORRESPONDING TO REPORT FINISH
- 7760 IF J<>FNF2(I5) THEN D(I5)=D(I5)-(FNF2(I5)-J) ELSE 7670
- 7770 PRINT "**** ADJUSTED TIME OF ";D$(I5);" TO";D(I5);"****"
- 7780 PRINT " **** RECALCULATING TIMES **** "
- 7790 F9=1:GOTO 570
- 7800 PRINT "**** IBM PC/XT ERROR NUMBER"ERR"AT"ERL
- 7810 END
- 7820 OPEN F$+".UPD" FOR OUTPUT AS #1
- 7870 WRITE #1,B4,B5,B6
- 7880 FOR I=1 TO N
- 7890 WRITE #1,D$(I),S(I),F(I),D(I),A6(I)
- 7900 NEXT I
- 7910 PRINT "**** CAUTION: YOU MUST CONSOLIDATE UPDATE FILES BEFORE CALLING NEW OPTIONS ****"
- 7920 CLOSE #1:RETURN
- 8000 REM ON ERROR GOTO 8200
- 8010 OPEN F$+".HOL" FOR INPUT AS #1
- 8020 J=0
- 8030 J=J+1
- 8040 IF EOF(1) THEN 8100
- 8050 INPUT #1,A3(J)
- 8060 GOTO 8030
- 8100 H9=J-1 'NUMBER OF HOLIDAYS
- 8110 CLOSE #1:RETURN
- 8200 PRINT "**** NO HOLIDAY FILE - CONTINUING ****":RESUME 8110
- 10000 REM SUBROUTINE TO CHECK FILENAME
- 10010 RETURN